iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

Django系列 第 23

Day23~Django 漫漫長路- 快取儲存法寶Redis

  • 分享至 

  • xImage
  •  

大家好,我是Leo
會來講解的是redis的應用方式,還沒安裝redis的朋友們,可以參考我的day20的文章/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


views.py

這邊資料直接爬取youbike資料當作測試

from django.core.cache import cache
import datetime
from rest_framework.response import Response
from rest_framework import permissions, views, status
import pandas as pd

class redisTaskTest(views.APIView):
    permission_classes = (permissions.AllowAny,)
    authentication_classes = []
    def get(self,request):
        #空白當key會error
        now = datetime.datetime.strftime(datetime.datetime.now(),"%Y-%m-%d")
        if cache.has_key(now):
            youbike_data = cache.get(now)
            return Response(youbike_data.values())
        else:
            '''
            sno(站點代號)、sna(中文場站名稱)、tot(場站總停車格)、sbi(可借車位數)、
            sarea(中文場站區域)、mday(資料更新時間)、lat(緯度)、lng(經度)、
            ar(中文地址)、sareaen(英文場站區域)、snaen(英文場站名稱)、aren(英文地址)、
            bemp(可還空位數)、act(場站是否暫停營運)
            '''
            url = "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"
            res = requests.get(url).json()
            df = pd.DataFrame(res)[['sna','updateTime','tot','sbi','bemp','lat','lng','sarea','ar']]
            
            df.sort_values(by=['sbi','bemp'],ascending=[False,False],axis=0,inplace=True)
            df.rename(columns={
                'sna':'站點','updateTime':'更新時間','tot':'場站總停車格','sbi':'可借車位數','bemp':'可還空位數',
                'lat':"緯度",'lng':'經度','sarea':'場站區域','ar':'地址'},inplace=True)

            result = df.T.to_dict()
            cache.set(now, result, 60 * 1)
            return Response({"success": True, "message": "儲存成功,請重新執行"}, status=status.HTTP_200_OK)

cache.set(0,1,2)
0:key
1:save data
2:keep time (second)
如上圖所示(now, result, 60 * 1)
key = 今天日期(str) key不能有空格 ex 2023-12-31 08:00 -> 2023-12-31-08:00
result 取得的dict資料
60*1 = 儲存60秒

判斷時否有這個key:cache.has_key(now)
取得快取資料:cache.get(now) 會根據儲存的key不同,找到相對應的value


urls.py

path('api/redis-task/test',csrf_exempt(redisTaskTest.as_view()),name='api-redis-task-test'),

postman測試

接下來我們就可以測試了
第一次request會比較久,因為再儲存key,value
第二次call api 就會快很多了,幾乎同時顯示資料
這邊也可以透過task celery 預先排程儲存至redis內

https://ithelp.ithome.com.tw/upload/images/20230606/20154853mNmGLsNbSZ.png


今天主要介紹redis使用方式,接下來我們來製作log檔的儲存,有時間的話會再講到系統日誌的製作
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day22~Django 漫漫長路- 如何使用api來達到異步任務執行task
下一篇
Day24~Django 漫漫長路- 快速找尋問題 logs檔的建立
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言